﻿using System;
using System.Collections.Generic;
using System.Linq;
using Wicture.DbRESTFul.SQL;
using Wicture.EPC.Service.Etka.Models;

namespace Wicture.EPC.Service.Etka.QueryInterceptors
{
    public static class VinFeaturesIdentifier
    {
        public static bool VerifyFeatureCodes(string brandCode, List<PR> vinPRs, string prNummers)
        {
            if (string.IsNullOrEmpty(prNummers)) return true;

            // 得到所有PR-Nummers
            var PRNummers = prNummers.Replace("/", ",").Split(',', StringSplitOptions.RemoveEmptyEntries).Distinct();

            // 如果是保时捷，RPNummer还通过 - 号作排除逻辑。如：PR:+351,-355，即，351和非355都适用。

            // 1. 先排除 - 的情况。
            foreach (var item in PRNummers.Where(p => p.StartsWith('-')).Select(p => p.TrimStart('-')))
            {
                // 如果Vin码中，有任何包括 -值的PRNummer，则不适用
                if (vinPRs.Any(p => p.PRNummer == item)) return false;
            }

            // 2. 处理正常情况：一个分组下，必须至少有一项是在vinPRs里面的。
            foreach (var item in PRNummers.Where(p => !p.StartsWith('-')))
            {

            }

            // 在当前Vin的PRs中过滤（包括Familie和Nummer）
            //var vPRs = vinPRs.Where(p => nummers.Contains(p.PRNummer)).ToList();
            
            //foreach (var items in aPRs.GroupBy(p => p.PRFamilie))
            //{
            //    var aPRNummers = items.Select(i => i.PRNummer);

            //    // Vin 中当前分组的 PRNummer
            //    var vPRNummers = vPRs.Where(p => p.PRFamilie == items.Key).Select(p => p.PRNummer);

            //    // 所有加号的 PRNummer，即只要有一个匹配就通过。
            //    var plusPRNummers = aPRNummers.Where(p => PRNummers.Contains(p) || PRNummers.Contains($"+{p}"));

            //    // 所有减号的 PRNummer，即都不匹配才能通过。
            //    var minusPRNummers = aPRNummers.Where(p => PRNummers.Contains($"-{p}"));

            //    if (plusPRNummers.Any(p => vPRNummers.Contains(p))) continue;
            //    else if (minusPRNummers.All(p => !vPRNummers.Contains(p))) continue;
            //    else return false;
            //}

            return true;
        }


        public static bool Load()
        {
            var connString = "server=db.91qpzs.com;port=3316;user=etka;password=KbqO7ZjnObL7tKNF;database=epc_porsche;charset=utf8;convert zero datetime=True;";
            var repository = new DbRESTFulRepository(new SqlConnectionManager { ReadConnectionString = connString });
            List<PRInfo> data = repository.InvokeCode<PRInfo>("SELECT * FROM vin_pr_familie_pr_nummer;", new object());

            var prs = new HashSet<string>("'220','XEX','022','051','075','080','098','1Z5','130','145','161'".Replace("'", "").Split(','));
            var items = data.Where(v => v.modelEpisTypes?.Contains("1035") != false && prs.Contains(v.PRNummer)).ToList();

            return items.Count() > 0;
        }
    }

}
